package com.tedu.review.day02;

/**
 * 普通类
 * 抽象类=抽象方法   关键字abstract
 * 它只有行为的概念 没有具体实现行为
 *
 * 与面向对象中的多态有绝对关系
 * 产生子类【实现类】同时具备实现的属性和方法
 *
 *
 * 什么下情况使用？
 * 复杂项目时 需要在不同类中出现 不同功能 首选抽象类【Android常用】
 *
 * 定义抽象类:
 * 修饰符 abstract class 类名{}   抽象类本身没有任何意义
 * 创建抽象类同时必须存在抽象方法:
 * 修饰符   abstract  返回值  方法名（）;   定义抽象的方法，提供给子类使用
 *
 * 抽象类实例化:
 * 必须使用多态，向上造型  自身无法实例化 子类【实现类】
 *
 * 定义   使用    注意
 *
 *
 */
abstract class Animals {
    //1可以使用static修饰
    //类定义:修饰符【abstract  static】 class 类名
    public abstract void say();   //抽象方法:没有任何实现

    //2定义修饰final的抽象方法    √
    // public final abstract void  sleep();
    //3定义抽象属性| 定义静态属性
    // abstract int i;
    static int i; //声明未赋值

    //4定义抽象静态属性
    // abstract static  int j;
    //5定义静态抽象方法       语法:修饰符【static abstract】返回值 方法名
    // public static abstract void eat();
    //6定义静态方法      需要代码块{}一定空  实现类不需要一定实现
    public static void eat() {}

    //7可以存在内部类  可以存在静态内部类
    public static class Sos { }
    //8抽象类构造器 - -- - 抽象类构造器存在对
    public Animals() {
    }
}
   //9抽象类可以继承抽象类    对
abstract  class thing extends Animals{
    //成员变量
       protected abstract int result();
       //实现类:子类 继承 抽象类 完成:抽象类方法
       //10实现类【子类】可以继承两个抽象类    不可以
   }

        class People extends Animals {
            public void say() {
                System.out.println("人---在说话---");

            }
        }
//实现类:假设Animals 有俩抽象方法  请问:子类需要实现抽象类的全部抽象方法
        class Monkey extends Animals {
            public void say() {
                System.out.println("猴子--说话");

            }
        }
        public class 抽象类 {
            public static void main(String[] args) {
                //抽象---实例化【创建对象 不能直接创建】--多态:向上造型
                Animals a = new People();
                a.say(); //输出:重写后的值  【方法互通】
                //实现抽象类实例化
                Animals a1 = new Monkey();
                a1.say();

            }
        }
